home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / science / cdrift3.zip / TEC3.C < prev    next >
C/C++ Source or Header  |  1990-02-22  |  7KB  |  172 lines

  1. /* This program is Copyright (c) 1990 David Allen.  It may be freely
  2.    distributed as long as you leave my name and copyright notice on it.
  3.    I'd really like your comments and feedback; send e-mail to
  4.    davea@vlsi.ll.mit.edu, or send us-mail to David Allen, 10 O'Moore Ave,
  5.    Maynard, MA 01754. */
  6.  
  7. /* This file contains the function getparams(), which reads parameters
  8.    from an input file.  The default values for all of the parameters are
  9.    set here as well. */
  10.  
  11. #include "const.h"
  12.  
  13. /* These are all of the adjustable parameters; they are completely
  14.    described in the file params.doc. */
  15.  
  16. long XSIZE = 90,    YSIZE = 90,    MAXSTEP = 100;
  17. long MAXBUMP = 50,    BUMPTOL = 50;
  18. long DRAWEVERY = 1,    BLOBLEVEL = 64,    DRAWMODE = DRAWMODE_GENERIC;
  19. long ZINIT = 22,    ZSUBSUME = 16,    ZCOAST = 16;
  20. long ZSHELF = 8,    ZMOUNTAIN = 48;
  21. long RIFTPCT = 40,    DOERODE = 1,    ERODERND = 4;
  22. long MAXCTRTRY = 50,    RIFTDIST = 5,    BENDEVERY = 6;
  23. long BENDBY = 50,    SPEEDRNG = 300,    SPEEDBASE = 200;
  24.  
  25. double MR [] = { 1.0,1.0,1.0,0.7,0.4,0.1,-0.2,-0.5,-0.8,-1.0 };
  26. long MAXLIFE = 10; /* Length of MR vector */
  27.  
  28.  
  29. #include <stdio.h>
  30. FILE *fp;
  31.  
  32. /* The input is handled by one function, gettoken, which returns one
  33.    of the following codes each time it is called. */
  34. #define TOK_EOF 0
  35. #define TOK_OPEN 1
  36. #define TOK_CLOSE 2
  37. #define TOK_WORD 3
  38.  
  39. short linecount = 1; /* So error messages can refer to a line number */
  40. char getbuf[256]; /* Storage for each token as it is being read */
  41.  
  42. /* A shorthand for string comparison */
  43. #define CMP(x) (!strcmp (getbuf, x))
  44.  
  45. extern float atof ();
  46.  
  47.  
  48. getparams (s) char *s; { 
  49.    /* This function is called by init() with one parameter, a string which
  50.    comes directly off the command line.  If the string is null, getparams()
  51.    is never called; otherwise, a "-" means standard input, while any other
  52.    text is treated as a filename and handed to fopen().  If the file doesn't
  53.    exist the program exits via panic().  Once the file is open, the function
  54.    expects to find paren-delimited pairs of (name value).  Value could be
  55.    a vector, like (name (val1 val2)).  After a name is found, there is
  56.    a very simple test, one string comparison per adjustable parameter,
  57.    to see if the name is recognized.  If unrecognized, the program panics.
  58.    If it is a recognized name, the appropriate parsing function, with the
  59.    appropriate parameters, is called.  There are three parsing functions,
  60.    getdim(), getlng(), and getdvec(). */
  61.  
  62.    short x, i, j;
  63.  
  64.    if (!strcmp (s, "-")) fp = stdin;
  65.    else { fp = fopen (s, "r"); if (!fp) panic ("Can't find input file"); }
  66.    
  67.    while ((x = gettoken (getbuf)) != TOK_EOF) {
  68.       if (x != TOK_OPEN) geterr ("expected open paren");
  69.       if (gettoken (getbuf) != TOK_WORD) geterr ("expected parameter name");
  70.       if      CMP ("XSIZE")    getdim  (&XSIZE);
  71.       else if CMP ("YSIZE")    getdim  (&YSIZE);
  72.       else if CMP ("MOVERATE")    getdvec (&MAXLIFE, MR);
  73.       else if CMP ("MAXSTEP")    getlng  (&MAXSTEP);
  74.       else if CMP ("MAXBUMP")    getlng  (&MAXBUMP);
  75.       else if CMP ("BUMPTOL")    getlng  (&BUMPTOL);
  76.       else if CMP ("DRAWEVERY")    getlng  (&DRAWEVERY);
  77.       else if CMP ("DRAWMODE")    getlng  (&DRAWMODE);
  78.       else if CMP ("BLOBLEVEL")    getlng  (&BLOBLEVEL);
  79.       else if CMP ("ZINIT")    getlng  (&ZINIT);
  80.       else if CMP ("ZSUBSUME")    getlng  (&ZSUBSUME);
  81.       else if CMP ("ZCOAST")    getlng  (&ZCOAST);
  82.       else if CMP ("ZSHELF")    getlng  (&ZSHELF);
  83.       else if CMP ("ZMOUNTAIN")    getlng  (&ZMOUNTAIN);
  84.       else if CMP ("RIFTPCT")    getlng  (&RIFTPCT);
  85.       else if CMP ("DOERODE")    getlng  (&DOERODE);
  86.       else if CMP ("ERODERND")    getlng  (&ERODERND);
  87.       else if CMP ("MAXCTRTRY")    getlng  (&MAXCTRTRY);
  88.       else if CMP ("RIFTDIST")    getlng  (&RIFTDIST);
  89.       else if CMP ("BENDEVERY")    getlng  (&BENDEVERY);
  90.       else if CMP ("BENDBY")    getlng  (&BENDBY);
  91.       else if CMP ("SPEEDBASE")    getlng  (&SPEEDBASE);
  92.       else if CMP ("SPEEDRNG")    getlng  (&SPEEDRNG);
  93.       else geterr ("unknown parameter name");
  94.       if (gettoken (getbuf) != TOK_CLOSE) geterr ("expected close paren"); } }
  95.  
  96.  
  97. gettoken (s) char *s; {
  98.    /* This is the only function which actually reads from the file.  It
  99.    maintains a one-character unget buffer.  It ignores initial whitespace,
  100.    but counts newlines to maintain an accurate linecount.  Open or close
  101.    parentheses count as tokens, and so does any amount of text with no
  102.    whitespace or parens.  The return code indicates whether end of file,
  103.    open paren, close paren, or a word were found.  If a word was found, it
  104.    is copied into the string pointed to by s.  When a word is found, the
  105.    character which terminated the word (whitespace, EOF or paren) is put
  106.    into the unget buffer to be read the next time gettoken() is called. */
  107.  
  108.    static char buf = 0; char c;
  109.  
  110.    white: if (buf) { c = buf; buf = 0; } else c = getc (fp);
  111.    switch (c) {
  112.       case '\n': linecount++;
  113.       case '\t': 
  114.       case ' ' : goto white; break;
  115.       case EOF : return (TOK_EOF); break;
  116.       case '(' : return (TOK_OPEN); break;
  117.       case ')' : return (TOK_CLOSE); break; }
  118.    text: if ((c==' ')||(c=='\t')||(c=='\n')||(c=='(')||(c==')')||(c==EOF)) {
  119.       buf = c; *s = 0; return (TOK_WORD); }
  120.    else { *s++ = c; c = getc (fp); goto text; } }
  121.  
  122.  
  123. geterr (s) char *s; {
  124.    /* Calls machine-specific panic() with nicely formatted message */
  125.    sprintf (getbuf, "Parameter error: %s in line %d", s, linecount);
  126.    panic (getbuf); }
  127.  
  128.  
  129. getlng (x) long *x; {
  130.    /* Called after reading a name associated with a single long,
  131.    this function just reads a long from the input file and uses atoi()
  132.    to convert it into a long, stored at the address passed in.   Note
  133.    that any text, including a string or a real, will be read; no type
  134.    checking is performed. */
  135.  
  136.    if (gettoken (getbuf) != TOK_WORD) geterr ("expected long");
  137.    *x = atoi (getbuf); }
  138.  
  139.  
  140. getdim (x) long *x; {
  141.    /* Called right after reading a name associated with an array bound,
  142.    this function reads one long from the input file; if the value is
  143.    greater than the default value assigned above, the user is trying
  144.    to exceed a compiled-in limit.  That's an error. */
  145.  
  146.    long y;
  147.  
  148.    if (gettoken (getbuf) != TOK_WORD) geterr ("expected long");
  149.    y = atoi (getbuf);
  150.    if (y > *x) geterr ("dimension exceeds reserved space");
  151.    *x = y; }
  152.  
  153.  
  154. getdvec (dim, v) long *dim; double *v; {
  155.    /* Called right after reading a name associated with a one-dimensional
  156.    array of doubles, this function expects to find a list of doubles
  157.    starting with an open paren and ended by a closing paren.  The parameter
  158.    dim contains the compiled-in array limit; if the input file contains
  159.    more than this number of entries, the function complains.  No type checking
  160.    is done; atof() is used to convert any text to a double.  On exit, the
  161.    dimension is set to the correct value. */
  162.  
  163.    short x; long i = 0;
  164.  
  165.    if (gettoken (getbuf) != TOK_OPEN)
  166.       geterr ("expected open paren");
  167.    while ((x = gettoken (getbuf)) == TOK_WORD) {
  168.       if (i == *dim) geterr ("vector is too long");
  169.       v[i++] = atof (getbuf); }
  170.    if (x != TOK_CLOSE) geterr ("expected close paren");
  171.    *dim = i; } 
  172.